中小企业多 IDC 之间的内网打通方案
缘起
这个问题我觉得中小公司有需求,但是大公司应该没这个需求,大公司肯定都找第三方直接 MPLS 之类的商业全套解决方案了。但是对于缺钱的中小企业,我觉得还是有借鉴意义的。
这篇文章本来是要讲“中小企业维护海外服务器的 VPN 方案”的,但讲着讲着,发现大部分内容,都是讲的“内网打通”。:(
这个方案准确讲是来自我在某个前司(前司比较多:)的一段工作经历,他们业务跑在海外公有云(AWS)上,技术团队在国内,连服务器需要先拨 VPN,直接拨经常断,所以我就折腾了这么一个方案出来,我在那里的一年多时间,完全没有出过问题。
方案细节
方案概况
正所谓:一图胜千文。所以,请看图:
注意:这里为了脱敏,我把一些真正的公网 IP 地址和公司产品的名字以及一些我认为是隐私的信息隐去了。
另外,上图其实可以和我的另外一篇文章:怎样在 checkpoint 设备和 AWS 北京的 EC2 之间搭建 IPsec 隧道 结合起来看。
所以,这个图其实是个“内网打通”的示意图。
关键点
海外节点之间的(内网)互联
各大公有云厂商,都有成熟的产品来处理内部的各个 VPC 之间的内网互通,比如如上图所示,aws 的相关产品,就叫 “transit gateway”,阿里云也有类似的产品,好像叫“云企业网”还是什么别的。Azure 和 GCP 就不太了解,但肯定有类似产品。
所以,这个问题的答案就是:
- 如果是厂商内部,直接使用厂商的产品即可。跨账号的 VPC 之间也支持(内网打通)哟,但是要注意内网 IP 别冲突了
- 如果是厂商之间、或者是厂商和自建 IDC 之间,那么推荐用 WireGuard 打通即可。
国内节点之间的(内网)互联
答案其实跟海外的一样:
- 厂商内部,直接用厂商的产品
- 跨厂商或跟 IDC 之间,用 WireGuard
当然,这里也有例外,比如上图所示:北京 office 和 AWS 北京节点之间,就是用 IPSec 而不是 WireGuard 打通的(具体怎么打通,前面有提到的一篇文章中有详细记载)。为什么这样呢?那主要是因为公司给北京办公室配置了设备呀,checkpoint 的防火墙!这货不支持 WireGuard。故而只能在 AWS 北京节点起台 ec2,装个 IPSec 服务,然后两者打通。
方案的“缺点”
这个方案就是路由表的维护需要仔细又仔细。其实并不难,主要是复杂,需要细心,维护时尽量对着图来做,配完多做测试。
补充一下 VPN 接入方案
前面有提到这个方案也可以用做 VPN 优化的。首先我们看看优化之前我们的 VPN 架构是怎么样的。
之前,VPN server 都是在海外的公有云节点上,国内连一个是慢,而最重要的是不稳定,非常容易被封。
而(内网打通)之后,我的 VPN 方案我推荐其主要接入点放在国内同一家厂商据用户最近的接入点(如上图例就是 aws 北京接入点,再准确点就是 IPSec 那台 EC2),然后再在海外每个节点保留一个冗余接入点即可。注意:这些 VPN 接入点的认证都是统一的。
这样一来从(VPN)主接入点来说,用户从国内(大概率是从北京)连过来,不容易被干扰,大概率不会被封,而同一厂商国内节点到海外节点之间数据链路也会比较稳定通畅,也不容易被干扰、被封。所以,整条链路不一定有多快,但肯定是要稳定的多得多得多。
方案的局限性
节点维护的复杂性
想想如果新加入一个节点,会需要做哪些操作。
通常,我们会把新的节点和已有的所有节点直连,当然,跨境的节点之间例外。而做 WireGuard 点对点配置,加一个对端点,需要改整个的配置,所以,理论上在一个点上改 WireGuard 配置时,上面的所有 WireGuard 链接都会受影响(因为大致需要重启 WireGuard 服务)。
路由选择的复杂性
还有一个,就是路由选择的可能的坑,比如节点 A、B 和 C 之间,两两互通,那么从 A 到 C,路由 A->C 和 A->B->C 都是可以的,而且一般情况下自然是直连也就是 A->C 更好,所以我们这里的方案也是 A->C。说了“一般情况”,那么肯定就还有“例外”吧,对的,像国内家庭宽带到海外节点之间,就是典型的例外情况,这种情况下直连远不如走国内的厂商中转一下。那么,像我们这样把这种例外情况下就不做直连,路由也直接走中转不就得了?这也不是绝对的,事情是变化的,也许这一时刻这条路由更优,下一时刻又是另外一条路由更优。:- 对啦,我想说的就是,远期有时间的时候,可以考虑下把路由扔给 OSPF 来管理,这样逼格完全就不一是一个层次了!:)
最优雅的内网互通方案
其实其实,说到“内网互联的方案”的我最最理想的情况,还是类似于自建 zerotier 的方案。自己搭建PLANT,然后每个节点找台网关机器接入自己的 zerotier 网络,这就完了,所有节点也就互通了。而且路由当能直通的时候,节点之间是直通的,当节点之间不能互通的时候,可以通过 PLANT 来互通。这才是内网互通的最优雅解决方案。下回有空谢谢这个。不过最好还是得哪个贵司给我个机会让我实践一下。:O